package com.atguigu.completablefuture;

import java.util.ArrayList;
import java.util.concurrent.*;

/**
 * @author wk
 * @create 2021-09-02 17:17
 * 测试异步编排
 */
public class CompletableFutureDemo {
    public static void main(String[] args) {
        // 创建异步对象
        // runAsync方法 无返回值 有两个重载的方法
        // 1. public static CompletableFuture<Void> runAsync(Runnable runnable)
        // 第一个参数为实现Runnable接口的实现类 第二个参数是线程池
        // 2.public static CompletableFuture<Void> runAsync(Runnable runnable,Executor executor)
        // 自定义线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,// 核心线程数
                10,// 最大线程数
                5L, //空闲线程的存活时间
                TimeUnit.SECONDS,// 时间单位
                new LinkedBlockingQueue<>(10),// 工作队列
                Executors.defaultThreadFactory(),// 线程工厂
                new ThreadPoolExecutor.AbortPolicy()// 默认的拒绝策略 抛异常 阻止系统正常运行
        );
        // CompletableFuture
        //  1.创建线程无返回值
        CompletableFuture.runAsync(() -> { // 使用的是Runnable   如果有异常只能将异常自己处理 不可以抛出来
            System.out.println(Thread.currentThread().getName());
        }, threadPoolExecutor);
        // 2.创建线程有返回值 参数二使用自定义线程池 如果不写则使用默认的线程池
        CompletableFuture.supplyAsync(()->{// 底层使用的是Callable 有返回值 如果有异常也可以将异常抛到主线程中
            System.out.println(Thread.currentThread().getName());
            return "supplyAsync";
        },threadPoolExecutor);
        // 3.基本没用
        CompletableFuture<ArrayList<Object>> listCompletableFuture = CompletableFuture.completedFuture(new ArrayList<>());
        try {
            System.out.println(listCompletableFuture.get()); // 显示集合列表中的数据
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}
